package com.hhs.storage.service;

import com.hhs.storage.bean.InputParam;
import com.hhs.storage.bean.PersonalPlan;
import com.baomidou.mybatisplus.extension.service.IService;
import com.hhs.storage.bean.ResponseBean;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.time.LocalDate;
import java.time.LocalTime;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 服务类
 * </p>
 *
 * @author hhs
 * @since 2023-01-13
 */
public interface PersonalPlanService extends IService<PersonalPlan> {
    public Map<String, Object> getAll(PersonalPlan personalPlan, InputParam inputParam);

    /**
     * 查询指定时间访问内的空闲任务
     *
     * @param personalPlan
     * @param inputParam
     * @return
     */
    public Map<String, Object> freeTable(PersonalPlan personalPlan, InputParam inputParam);

    /**
     * 查询部门及子部门每日最新完成任务
     *
     * @param departIds
     * @param workDate
     * @param inputParam
     * @return
     */
    public Map<String, Object> getDepartmentDailyPlan(String departIds, LocalDate workDate, InputParam inputParam);

    /**
     * 查询关注的人每日任务
     *
     * @param workDate
     * @param inputParam
     * @return
     */
    public Map<String, Object> getFollowUserDailyTable(LocalDate workDate, String groupId, InputParam inputParam);

    /**
     * 查询项目所有用户每人每日的所有任务
     *
     * @param projectId  项目id
     * @param workDate
     * @param inputParam
     * @return
     */
    public Map<String, Object> getProjectDailyTable(String projectId, LocalDate workDate, InputParam inputParam);

    /**
     * 查询部门及子部门所有用户每人每日的所有任务
     *
     * @param departIds
     * @param workDate
     * @param inputParam
     * @return
     */
    public Map<String, Object> getDepartmentDailyTable(String departIds, LocalDate workDate, InputParam inputParam);

    /**
     * 查询指定用户一周内任务
     *
     * @param userId   用户id
     * @param workDate 某周日期
     * @return
     */
    public Map<String, Object> getPersonalPlanByWeek(String userId, String projectId, LocalDate workDate, Boolean secondWeek);

    /**
     * 给领导派发任务添加领导信息
     *
     * @param personalPlanList
     */
    public void leaderPlanAddLeader(List<PersonalPlan> personalPlanList);

    public Map<String, Object> addOrUpdate(PersonalPlan personalPlan);

    public Map<String, Object> dele(String id, boolean isCompleteDel);

    public Map<String, Object> stateChange(String id, Integer state);

    /**
     * 当天已使用时间段
     *
     * @param userId   指定用户
     * @param workDate 指定时间
     * @return
     */
    public Map<String, Object> getUsedTime(String userId, LocalDate workDate);

    /**
     * 删除指定日期指定时间段任务
     *
     * @param userId
     * @param workDate
     * @param startTime
     * @param endTime
     * @return
     */
    public Map<String, Object> deleAll(String userId, LocalDate workDate, LocalTime startTime, LocalTime endTime);

    /**
     * 删除指定日期任务
     *
     * @param userId
     * @param workDate
     * @return
     */
    @PostMapping(value = "deleAllDay")
    public Map<String, Object> deleAllDay(String userId, LocalDate workDate);

    /**
     * 完成指定日期指定时间段任务
     *
     * @param userId
     * @param workDate
     * @param startTime
     * @param endTime
     * @return
     */
    public Map<String, Object> completeAll(String userId, LocalDate workDate, LocalTime startTime, LocalTime endTime);

    /**
     * 获取个人计划统计数据
     *
     * @param inputParam name 用户姓名
     * @param inputParam id 部门id
     * @param startDate  开始日期
     * @param endDate    结束日期
     * @return
     */
    public Map<String, Object> statisticalByUser(LocalDate startDate, LocalDate endDate, InputParam inputParam);

    /**
     * 获取关注的人的个人计划统计数据
     *
     * @param inputParam name 用户姓名
     * @param startDate  开始日期
     * @param endDate    结束日期
     * @return
     */
    public Map<String, Object> statisticalByFollowUser(String groupId, LocalDate startDate, LocalDate endDate, InputParam inputParam);

    /**
     * 获取站点统计数据
     *
     * @param inputParam name 用户姓名
     * @param inputParam id 部门id
     * @param startDate  开始日期
     * @param endDate    结束日期
     * @return
     */
    public Map<String, Object> statisticalSiteByUser(LocalDate startDate, LocalDate endDate, InputParam inputParam);

    /**
     * 根据条件查询用户对应类型的计划个数
     *
     * @param startDate
     * @param endDate
     * @param userId
     * @param type
     * @return
     */
    public int getPlanNumByUser(LocalDate startDate, LocalDate endDate, String userId, Integer type);

    /**
     * 获取当天未完成任务
     *
     * @return
     */
    public Map<String, Object> getTodayUndoPlan();

    //个人计划 ctrl多选模式 批量完成
    Map<String, Object> completeByPlanIds(String planIds);

    //个人计划 ctrl多选模式 批量取消完成
    Map<String, Object> uncompleteByPlanIds(String planIds);

    //个人计划 ctrl多选模式 批量删除
    Map<String, Object> deleByPlanIds(String planIds);

    //个人计划 ctrl多选模式 批量修改
    Map<String, Object> editByPlanIds(PersonalPlan personalPlan, String planIds);

    //根据项目id获取该员工所有的项目计划
    Map<String, Object> getPlanByProId(InputParam inputParam);

    ResponseBean<String> changeWeek(InputParam inputParam);
}
